import numpy as np
import cv2
# 读取视频文件
cap = cv2.VideoCapture('bike.mp4')
# 循环播放视频文件，同时显示原视频及其对应的灰度图
# 检查视频是否成功打开
while cap.isOpened():
    # 逐帧读取视频，ret 为布尔值，表示是否成功读取帧，frame 为当前帧的图像数据
    ret, frame = cap.read()
    if not ret:
        print("没有内容退出 :) ")
        break
    #每一帧照片
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    #每一帧照片的傅里叶系数
    fCoefs_2D = np.fft.fft2(gray)
    #得到每一帧照片的原始振幅
    msp = np.abs(fCoefs_2D)
    #将振幅谱排序
    msp_sorted = np.sort(msp.ravel())
    #压缩比列表
    compression_rations = [0.5, 0.05]

    for keep in compression_rations:
        # 计算保留振幅的阈值
        thresh = msp_sorted[int((1 - keep) * gray.size)]
        # 创建掩码，保留振幅大于阈值的频率分量
        mask = msp > thresh
        # 使用掩码压缩傅里叶系数（模拟通过网络传输压缩后的系数）
        fCoefs_2D_cp = fCoefs_2D * mask
        # 使用压缩后的傅里叶系数进行逆傅里叶变换，得到压缩后的图像
        gray_cp = np.fft.ifft2(fCoefs_2D_cp).real
        #gray_cp = np.abs(gray_cp)
        # 转换为8位无符号整数类型
        gray_cp = gray_cp.astype('uint8')
        #展示窗口
        cv2.imshow(f'Compression:{keep}', gray_cp)

    cv2.imshow('frame', gray)
    # 每隔 1ms 检查一次用户输入，如果按下 'q' 键，退出循环
    if cv2.waitKey(1) == ord('q'):
        print("用户退出！")
        break
# 释放视频捕捉资源
cap.release()
# 关闭所有的 GUI 窗口
cv2.destroyAllWindows()